package base_jwt

import (
	"github.com/gin-gonic/gin"
	"go-likaladi-shop/common/base_util"
	"net/http"
)

// JwtInterceptHandle 是一个 Gin 中间件，用于拦截请求并验证 JWT 令牌是否合法。
// 如果令牌无效，则返回 401 未授权错误，并终止请求的进一步处理。
// 如果令牌有效，则将解析出的用户信息存入 Gin 的上下文，供后续处理使用。
func JwtInterceptHandle(signingKey string) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		// 解析并验证 JWT 令牌
		claims, ok := parseToken(ctx, signingKey)
		if !ok {
			// 如果解析失败，则终止请求处理
			ctx.Abort()
			return
		}

		// 将解析出的 JWT 负载（claims）存入 Gin 上下文，方便后续处理
		ctx.Set("claims", claims)    // 存储解析出的 claims 结构体
		ctx.Set("userId", claims.ID) // 将用户 ID 存入上下文，便于后续获取

		// 继续执行后续处理逻辑
		ctx.Next()
	}
}

// parseToken 解析并验证 JWT 令牌。
// 如果令牌有效，则返回解析出的用户信息（claims）；否则返回错误信息，并终止请求。
func parseToken(ctx *gin.Context, signingKey string) (*CustomClaims, bool) {
	// 从 HTTP 头部的 Authorization 字段获取 Token
	token := ctx.GetHeader("Authorization")

	// 检查是否提供了令牌
	if token == "" {
		// 如果没有提供令牌，返回 401 未授权错误，并终止请求
		base_util.HttpCodeError(http.StatusUnauthorized, "token 不能为空", ctx)
		return nil, false
	}

	// 解析并验证 JWT 令牌
	claims, err := ParseToken(token, signingKey)
	if err != nil {
		// 如果解析失败，返回 401 未授权错误，并终止请求
		base_util.HttpCodeError(http.StatusUnauthorized, err.Error(), ctx)
		return nil, false
	}

	// 令牌解析成功，返回解析后的 claims 数据
	return claims, true
}
